package copyengine.utils.delayEffect.logic
{
	import copyengine.scenes.viewport.ICEViewportListener;
	import copyengine.utils.GeneralUtils;

	import flash.display.DisplayObjectContainer;
	import flash.display.Sprite;
	import flash.geom.Rectangle;

	public final class CEDelayEffectLayerManger implements ICEViewportListener
	{
		/**
		 *<b>现在存在的问题是</b>delayEffect需要同时在三层Layer上面播放</br></br>
		 * <li><b>Scene</b>上面(房间掉落Icon的Effect) 该层Layer会跟随视口的移动而移动
		 * <li><b>SceneUILayer</b> 贝塞尔移动，Icon+1动画等 都是在这层播放,如果使用场景层Pos初始化，也会先将场景层Pos转换到GlobalPos
		 * 不用转换到这层Pos的原因是因为这层Layer和GlobalLayer都是（0,0）坐标对齐，并且永远不会移动。转换完成后在播放动画，此时动画的
		 * 特点是播放动画期间，动画不随着场景移动而发生位置改变，比如在(10,10)这个位置播放一个+1动画,此时移动场景 动画仍旧在这个位置播放
		 * <li><b>GlobalUILayer</b> 这层是高于App.as中的SceneLayer和DialogLayer,也就是在Dialog内部的动画会在这层播放，比如Quest系统中的Effect
		 * 如果在SceneUILayer中播放则会被弹出的Dialog面板挡住，如果直接把所有DelayEffectLayer提升到比Dialog级别还要高，会出现玩家打开着Dialog面板
		 * 然后因为时间出发的DelayEffect会从Dialog面板上方播放，但是此时应该是面板遮住动画
		 *
		 * <p></p><b>关于使用static变量和而不是单例</b></br></br>
		 * 因为DelayEffect访问到了比Scene还有高层的资源，理论它应该为一个单例，不过delayEffect又需要在每个场景进行initial和dispose
		 * 因为它需要监听到视口的移动,所以仍旧把它不当做单例处理。但是它每次初始化时候又需要比场景高的资源GlobalLayer去进行初始化
		 * Scene中又没有权限得到该资源，所以使用一个static变量在GUIInitialMediator先把这个变量初始化好
		 *
		 */
		private var globalUILayer:DisplayObjectContainer;
		private var sceneUILayer:Sprite;
		private var sceneLayer:Sprite;

		/**
		 *<b>SceneLayer是对sceneUILayer&sceneLayer的Warp</b>
		 * </br></br>因为DelayEffectManger需要在场景中初始化,初始化时候
		 * 需要将SceneLayer添加到所有Scene上面物体的最高层,<b>及sceneUILayer&sceneLayer会盖住所底下的物体</b>
		 */
		private var sceneLayerContainer:Sprite;

		private var scrollRect:Rectangle;

		public function CEDelayEffectLayerManger()
		{
		}

		public function initialize(_gloableUILayer:DisplayObjectContainer):void
		{
			globalUILayer = _gloableUILayer;
			scrollRect = new Rectangle();
			sceneLayerContainer = new Sprite();
			sceneUILayer = new Sprite();
			sceneLayer = new Sprite();
			sceneLayerContainer.addChild(sceneUILayer);
			sceneLayerContainer.addChild(sceneLayer);
		}

		public function dispose():void
		{
			GeneralUtils.removeTargetFromParent(sceneLayerContainer);
			GeneralUtils.removeTargetFromParent(sceneUILayer);
			GeneralUtils.removeTargetFromParent(sceneLayer);
			sceneLayerContainer = null;
			sceneUILayer = null;
			sceneLayer = null;
			globalUILayer = null;
		}

		public function viewportInitialized(_posX:int, _posY:int, _viewportWidth:int, _viewportHeight:int):void
		{
			updatePos(_posX, _posY, _viewportWidth, _viewportHeight);
		}

		public function viewportNotMoveUpdate(_currentPosX:int, _currentPosY:int, _viewportWidth:int, _viewportHeight:int):void
		{
		}

		public function viewportMoveUpdate(_currentPosX:int, _currentPosY:int, _prePosX:int, _prePosY:int, _viewportWidth:int, _viewportHeight:int):void
		{
			updatePos(_currentPosX, _currentPosY, _viewportWidth, _viewportHeight);
		}

		private function updatePos(_posX:int, _posY:int, _viewportWidth:int, _viewportHeight:int):void
		{
			scrollRect.width = _viewportWidth;
			scrollRect.height = _viewportHeight;
			scrollRect.x = _posX;
			scrollRect.y = _posY;
			sceneLayer.scrollRect = scrollRect;
		}

		public function getSceneLayerContainer():DisplayObjectContainer
		{
			return sceneLayerContainer;
		}

		public function getSceneUILayer():DisplayObjectContainer
		{
			return sceneUILayer;
		}

		public function getSceneLayer():DisplayObjectContainer
		{
			return sceneLayer;
		}

		public function getGlobalUILayer():DisplayObjectContainer
		{
			return globalUILayer;
		}

	}
}
